class Solution(object):
    def numDecodings(self, s):
        # 处理边界情况
        if not s or s[0] == '0':
            return 0
            
        n = len(s)
        # dp[i]表示前i个字符的解码方法数
        dp = [0] * (n + 1)
        dp[0] = 1  # 空字符串有一种解码方式
        dp[1] = 1  # 单个非零字符有一种解码方式
        
        for i in range(2, n + 1):
            # 当前字符单独解码的情况
            if s[i-1] != '0':
                dp[i] += dp[i-1]
                
            # 当前字符与前一个字符组合解码的情况
            two_digit = int(s[i-2:i])
            if 10 <= two_digit <= 26:
                dp[i] += dp[i-2]
                
        return dp[n]